package Domaine;


import java.awt.Point;
import java.util.ArrayList;
import java.util.List;

import Domaine.Urgence;
import Erreurs.ChiffreInvalide;

/**
 * 
 * @author Noyau
 * @version 1.0
 * @since 2013-11-12
 * File VehiculeUrgence.java
 *
 */
public class VehiculeUrgence implements Cloneable
{
	
	public enum EtatVehicule {
		EnAttente,
		EnDeplacement,
		TraitementUrgence
	}
	
	//Attributs
	private float _vitesse;							//La vitesse de d�placement du v�hicule
	private float _distanceParcourue;				//La distance parcourue du v�hicule
	private List<Urgence> _listeUrgencesATraiter;	//La liste des urgences � traiter
	private Noeud _portAttache;						//Le noeud du port d'attache du v�hicule
	private Point _coordonnee;					//Les coordonn�es du v�hicule d'urgence sur la carte
	private EtatVehicule _etat;
	
	/**
	 * Constructeur de la classe
	 * @param aPortAttache : Le port d'attache du v�hicule
	 * 
	 */
	public VehiculeUrgence(Noeud aPortAttache) 
	{
		this._coordonnee = aPortAttache.getCoordonee();
		this._distanceParcourue = 0.0f;
		//this._listeUrgencesATraiter.clear();
		this._portAttache = aPortAttache;
		this._vitesse = 20.0f;
		this._etat = EtatVehicule.EnAttente;
	}
	
	public VehiculeUrgence clone() 
	{
		VehiculeUrgence copy = null;
		try
		{
			copy = (VehiculeUrgence) super.clone();
		} catch(CloneNotSupportedException copyExcept)
		{
			copyExcept.printStackTrace(System.err);
		}
		
		if (_listeUrgencesATraiter == null)
		{
			copy._listeUrgencesATraiter = null;
		}
		else
		{
			copy._listeUrgencesATraiter = new ArrayList<Urgence>();
			for(Urgence urgence: _listeUrgencesATraiter) copy._listeUrgencesATraiter.add(urgence.clone());
		}
	
  	    copy._portAttache = _portAttache.clone();
  	    
		return copy;
	}

	/**
	 * Obtenir la vitesse du v�hicule
	 * @return float La vitesse du v�hicule
	 */
	public float getVitesse() 
	{
		return this._vitesse;
	}

	/**
	 * Modifier la vitesse du v�hicule
	 * @param aVitesse : La nouvelle vitesse du v�hicule
	 * @throws ChiffreInvalide si la vitesse est inf�rieur � 0
	 */
	public void setVitesse(float aVitesse) throws ChiffreInvalide
	{
		if (aVitesse < 0.0f)
		{
			throw new ChiffreInvalide("Vitesse inf�rieure � 0");
		}
		
		this._vitesse = aVitesse;
	}

	/**
	 * 
	 * @return float la distance parcourue du v�hicule
	 */
	public float getDistanceParcourue()
	{
		return this._distanceParcourue;
	}
	
	/**
	 * Modifier la distance du v�hicule
	 * @param aDistanceParcourue : La nouvelle distance parcourue du v�hicule
	 */
	public void setDistanceParcourue(float aDistanceParcourue) 
	{
		
		
		this._distanceParcourue = aDistanceParcourue;
	}

	/**
	 * 
	 * @return Noeud : Le port d'attahce du v�hicule d'urgence
	 */
	public Noeud getPortAttache() 
	{
		return this._portAttache;
	}

	/**
	 * Modifier le port d'attache du Noeud
	 * @param aPortAttache
	 */
	public void setPortAttache(Noeud aPortAttache) 
	{
		this._portAttache = aPortAttache;
		//if (aPortAttache != null)
		//	this._coordonnee = aPortAttache.getCoordonee();
	}

	/**
	 * 
	 * @return Coordonnee : Les coordonn�es du v�hicule d'urgence
	 */
	public Point getCoordonnee() 
	{
		return this._coordonnee;
	}

	/**
	 * 
	 * @param aCoordonnee : La nouvelle coordonn�e
	 */
	public void setCoordonnee(Point aCoordonnee) 
	{
		this._coordonnee = aCoordonnee;
	}

	/**
	 * @return List<Urgence> : La liste des urgences � traiter ordonn�es
	 */
	public List<Urgence> get_listeUrgencesATraiter() 
	{
		return _listeUrgencesATraiter;
	}

	/**
	 * @param List<Urgence> : La liste des urgences
	 */
	public void set_listeUrgencesATraiter(List<Urgence> _listeUrgencesATraiter)
	{
		this._listeUrgencesATraiter = _listeUrgencesATraiter;
	}
	
	public void setEtat(EtatVehicule etat) {
		this._etat = etat;
	}
	
	public EtatVehicule getEtat() {
		return this._etat;
	}
	
	
}